Introduction

Inaugural speech is not only the the first official speech of any president of United States, but also reflects the personality, sentiment, interested topics for the next few years and so on. The following analysis mainly focus on the difference of inaugural speeches between Democratic Party and Republican Party(part 1). Then, we compare the inaugural speeches of DonaldJTrump and BarackObama(part 2).

 [1] "1789-04-30" "1793-03-04" "1797-03-04" "1801-03-04" "1805-03-04" "1809-03-04" "1813-03-04"
 [8] "1817-03-04" "1821-03-04" "1825-03-04" "1829-03-04" "1833-03-04" "1837-03-04" "1841-03-04"
[15] "1845-03-04" "1849-03-05" "1853-03-04" "1857-03-04" "1861-03-04" "1865-03-04" "1869-03-04"
[22] "1873-03-04" "1877-03-05" "1881-03-04" "1885-03-04" "1889-03-04" "1893-03-04" "1897-03-04"
[29] "1901-03-04" "1905-03-04" "1909-03-04" "1913-03-04" "1917-03-04" "1921-03-04" "1925-03-04"
[36] "1929-03-04" "1933-03-04" "1937-01-20" "1941-01-20" "1945-01-20" "1949-01-20" "1953-01-20"
[43] "1957-01-21" "1961-01-20" "1965-01-20" "1969-01-20" "1973-01-20" "1977-01-20" "1981-01-20"
[50] "1985-01-21" "1989-01-20" "1993-01-20" "1997-01-20" "2001-01-20" "2005-01-20" "2009-01-20"
[57] "2013-01-21" "2017-01-20" NA          

Part 1: The story of inaugural speeches of Democratic Party and Republican Party

It is well known that Democrats and republicans have different platforms, development goals and different interests. So what are the similarities and differences of their speeches?

1.1 The change of number of words over time

According to the barplot above, we may see that:

For Democratic presidents’ speeches:

(1) Most of the speeches are under 4000 words.

(2) The number of words fluctuate over time.

(3) As time goes by, there is a slight trend that their speeches contain more and more words.

For Republican presidents’ speeches:

(1) Most of the speeches are under 5000 words.

(2) The number of words fluctuate over time.

(3) As time goes by, there is a slight trend that their speeches contain more and more words.

It seems like that the word average number of Republican presidents’ speeches is more than that of Democratic presidents’ speeches. Is it right?

According to the graph above, we can see that the average word number of Democratic presidents’ speeches is about 3000. As for Republican presidents’ speeches, it is about 3500. So we have the right guess.

1.2 Overview of sentence length distribution by different Party of speeches

For simpler visualization, we chose a subset of better known presidents or presidential candidates on which to focus our analysis.

 [1] "DonaldJTrump"         "JohnMcCain"           "GeorgeBush"           "MittRomney"          
 [5] "GeorgeWBush"          "RonaldReagan"         "AlbertGore,Jr"        "HillaryClinton"      
 [9] "JohnFKerry"           "WilliamJClinton"      "HarrySTruman"         "BarackObama"         
[13] "LyndonBJohnson"       "GeraldRFord"          "JimmyCarter"          "DwightDEisenhower"   
[17] "FranklinDRoosevelt"   "HerbertHoover"        "JohnFKennedy"         "RichardNixon"        
[21] "WoodrowWilson"        "AbrahamLincoln"       "TheodoreRoosevelt"    "JamesGarfield"       
[25] "JohnQuincyAdams"      "UlyssesSGrant"        "ThomasJefferson"      "GeorgeWashington"    
[29] "WilliamHowardTaft"    "AndrewJackson"        "WilliamHenryHarrison" "JohnAdams"           

These are the presidnets we chose.

For relevant to Trump’s speeches, we will only compare speeches for the first terms of former U.S. presidents.

1.2.1 Democratic

We may notice that most of their sentences are between 1 and 30 words. The distribution of number of words in a sentence is relatively smooth and average.

1.2.2 Republican

As for Republican presidents, we find that they have more sentences under 20 words. So most of their points concentrate on the left side of the graph.

1.3 Clustering of emotions

By clustering of emotions of all these chosen speeches from different Party, we can see that:

(1) The speeches from different Party may be in the same emotion cluster, like William Howard Taft and BarackObama.

(2) The speeches from the same Party may be in different emotion cluster, like Franklin D. Roosevelt and BarackObama.

With all the finding we conclude from part 1, next we will focus on the difference of speeches between DonaldJTrump and BarackObama.

Part 2: The story of inaugural speeches of DonaldJTrump and BarackObama

Generally speaking, there are lots of differences between DonaldJTrump and BarackObama, ages, Parties, experience and so on. How about their inaugural speeches?

2.1 Overview of sentence length distribution

For relevant to Trump’s speeches, we will only compare speeches for the first terms of former U.S. presidents.

It is obvious that DonaldJTrump has more short sentences than BarackObama. BarackObama has lots of sentences with more than 25 words.

So will the number of words be different?

According to the barplot above, we can find that the speeches of DonaldJTrump has about 4300 words. However, the speeches of BarackObama has about 3600 words, which is much less than DonaldJTrump.

2.2 DonaldJTrump VS BarackObama, what are their short sentences?

We will notice that most of their short sentences are similar, like ‘Thank you’. The ‘America first’ in Trump’s speech and the ‘diversity and openness’ in Obama’s speech show a big difference in their concept of running a country, especially its external attitude.

2.3 Sentiment analsis

The following analysis shows that sentence length variation over the course of the speech, with emotions. How the presidents alternate between long and short sentences and how they shift between different sentiments in their speeches. We use the same color to show the same emotion.

2.3.1 DonaldJTrump VS BarackObama

It is obvious that the emotion of Trump’s sentences are more easily changed. On contract, the emotion of Obama’s sentences are more coherence.

What are the emotionally charged sentences?

[1] "Donald Trump"
[1] "No challenge can match the heart and fight and spirit of America."
[2] "God bless you, and God bless America."                            
[3] "America will start winning again, winning like never before."     
[4] "No challenge can match the heart and fight and spirit of America."
[5] "Today's ceremony, however, has very special meaning."             
[6] "America will start winning again, winning like never before."     
[7] "Today's ceremony, however, has very special meaning."             
[8] "God bless you, and God bless America."                            
[1] "Barack Obama"
[1] "On this day, we gather because we have chosen hope over fear, unity of purpose over conflict and discord."
[2] "This is the journey we continue today."                                                                   
[3] "We remain the most prosperous, powerful nation on Earth."                                                 
[4] "Our Nation is at war against a far-reaching network of violence and hatred."                              
[5] "We remain the most prosperous, powerful nation on Earth."                                                 
[6] "Our Nation is at war against a far-reaching network of violence and hatred."                              
[7] "This is the meaning of our liberty and our creed;"                                                        
[8] "God bless you, and God bless the United States of America."                                               

2.4 Topic modeling

For topic modeling, we prepare a corpus of sentence snipets as follows. For each speech, we start with sentences and prepare a snipet with a given sentence with the flanking sentences.

2.4.1 Topics differences between Trump and Obama

 [1] "Economy"         "America"         "Defense"         "Belief"          "Election"       
 [6] "Patriotism"      "Unity"           "Government"      "Reform"          "Temporal"       
[11] "WorkingFamilies" "Freedom"         "Equality"        "Misc"            "Legislation"    
 [1] 0.04189455 0.08378911 0.12568366 0.16757822 0.20947277 0.25136733 0.29326188 0.33515644
 [9] 0.37705099 0.41894555 0.46084010 0.50273466 0.54462921 0.58652377 0.62841832
 [1] 0.04247576 0.08495153 0.12742729 0.16990306 0.21237882 0.25485459 0.29733035 0.33980612
 [9] 0.38228188 0.42475765 0.46723341 0.50970917 0.55218494 0.59466070 0.63713647

According to the result, we may find that:

(1) For BarackObama, it is equality, freedom, government and America.

Conclusion

In conclusion, from these analysis, we may find a lot of differences between the inaugural speech of Democratic Party and Republican Party, including the number of words, sentence distribution, emotion cluster and so on.

So as to DonaldJTrump from Republican Party and BarackObama from Democratic Party, they have lots of differences in their speech’s pattern, like sentiment difference, topic difference and so on.

Reference

LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgcHJlc2lkZW50aWFsIGluYXVndXJhbCBzcGVlY2hlcyAtIGJhc2VkIG9uIFBhcnR5IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIEludHJvZHVjdGlvbgoKIyMjIEluYXVndXJhbCBzcGVlY2ggaXMgbm90IG9ubHkgdGhlIHRoZSBmaXJzdCBvZmZpY2lhbCBzcGVlY2ggb2YgYW55IHByZXNpZGVudCBvZiBVbml0ZWQgU3RhdGVzLCBidXQgYWxzbyByZWZsZWN0cyB0aGUgcGVyc29uYWxpdHksIHNlbnRpbWVudCwgaW50ZXJlc3RlZCB0b3BpY3MgZm9yIHRoZSBuZXh0IGZldyB5ZWFycyBhbmQgc28gb24uIFRoZSBmb2xsb3dpbmcgYW5hbHlzaXMgbWFpbmx5IGZvY3VzIG9uIHRoZSBkaWZmZXJlbmNlIG9mIGluYXVndXJhbCBzcGVlY2hlcyBiZXR3ZWVuIERlbW9jcmF0aWMgUGFydHkgYW5kIFJlcHVibGljYW4gUGFydHkocGFydCAxKS4gVGhlbiwgd2UgY29tcGFyZSB0aGUgaW5hdWd1cmFsIHNwZWVjaGVzIG9mIERvbmFsZEpUcnVtcCBhbmQgQmFyYWNrT2JhbWEocGFydCAyKS4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQojIGNoZWNrIGFuZCBpbnN0YWxsIG5lZWRlZCBwYWNrYWdlcy4gTG9hZCB0aGUgbGlicmFyaWVzIGFuZCBmdW5jdGlvbnMuIAoKcGFja2FnZXMudXNlZD1jKCJydmVzdCIsICJ0aWJibGUiLCAicWRhcCIsIAogICAgICAgICAgICAgICAgInNlbnRpbWVudHIiLCAiZ3Bsb3RzIiwgImRwbHlyIiwKICAgICAgICAgICAgICAgICJ0bSIsICJzeXV6aGV0IiwgImZhY3RvZXh0cmEiLCAKICAgICAgICAgICAgICAgICJiZWVzd2FybSIsICJzY2FsZXMiLCAiUkNvbG9yQnJld2VyIiwKICAgICAgICAgICAgICAgICJSQU5OIiwgInRtIiwgInRvcGljbW9kZWxzIikKCiMgY2hlY2sgcGFja2FnZXMgdGhhdCBuZWVkIHRvIGJlIGluc3RhbGxlZC4KcGFja2FnZXMubmVlZGVkPXNldGRpZmYocGFja2FnZXMudXNlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdChpbnN0YWxsZWQucGFja2FnZXMoKVssMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMudXNlZCkpCiMgaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzCmlmKGxlbmd0aChwYWNrYWdlcy5uZWVkZWQpPjApewogIGluc3RhbGwucGFja2FnZXMocGFja2FnZXMubmVlZGVkLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQp9CgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSgicnZlc3QiKQpsaWJyYXJ5KCJ0aWJibGUiKQojIFlvdSBtYXkgbmVlZCB0byBydW4KIyBzdWRvIGxuIC1mIC1zICQoL3Vzci9saWJleGVjL2phdmFfaG9tZSkvanJlL2xpYi9zZXJ2ZXIvbGlianZtLmR5bGliIC91c3IvbG9jYWwvbGliCiMgaW4gb3JkZXIgdG8gbG9hZCBxZGFwCmxpYnJhcnkoInFkYXAiKQpsaWJyYXJ5KCJzZW50aW1lbnRyIikKbGlicmFyeSgiZ3Bsb3RzIikKbGlicmFyeSgiZHBseXIiKQpsaWJyYXJ5KCJ0bSIpCmxpYnJhcnkoInN5dXpoZXQiKQpsaWJyYXJ5KCJmYWN0b2V4dHJhIikKbGlicmFyeSgiYmVlc3dhcm0iKQpsaWJyYXJ5KCJzY2FsZXMiKQpsaWJyYXJ5KCJSQ29sb3JCcmV3ZXIiKQpsaWJyYXJ5KCJSQU5OIikKbGlicmFyeSgidG0iKQpsaWJyYXJ5KCJ0b3BpY21vZGVscyIpCgpzb3VyY2UoIi4uL2xpYi9wbG90c3RhY2tlZC5SIikKc291cmNlKCIuLi9saWIvc3BlZWNoRnVuY3MuUiIpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFfQojIGNvbnN0cnVjdCB0aGUgZGF0YXNldAoKIyMjIEluYXVndWFyYWwgc3BlZWNoZXMKbWFpbi5wYWdlIDwtIHJlYWRfaHRtbCh4ID0gImh0dHA6Ly93d3cucHJlc2lkZW5jeS51Y3NiLmVkdS9pbmF1Z3VyYWxzLnBocCIpCiMgR2V0IGxpbmsgVVJMcwojIGYuc3BlZWNobGlua3MgaXMgYSBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBsaW5rcyBmcm9tIHRoZSBsaXN0IG9mIHNwZWVjaGVzLiAKaW5hdWc9Zi5zcGVlY2hsaW5rcyhtYWluLnBhZ2UpCmFzLkRhdGUoaW5hdWdbLDFdLCBmb3JtYXQ9IiVCICVlLCAlWSIpCmluYXVnPWluYXVnWy1ucm93KGluYXVnKSxdICMgcmVtb3ZlIHRoZSBsYXN0IGxpbmUsIGlycmVsZXZhbnQgZHVlIHRvIGVycm9yLgoKIyMjIyBOb21pbmF0aW9uIHNwZWVjaGVzCm1haW4ucGFnZT1yZWFkX2h0bWwoImh0dHA6Ly93d3cucHJlc2lkZW5jeS51Y3NiLmVkdS9ub21pbmF0aW9uLnBocCIpCiMgR2V0IGxpbmsgVVJMcwpub21pbiA8LSBmLnNwZWVjaGxpbmtzKG1haW4ucGFnZSkKIyMjIyBGYXJld2VsbCBzcGVlY2hlcwptYWluLnBhZ2U9cmVhZF9odG1sKCJodHRwOi8vd3d3LnByZXNpZGVuY3kudWNzYi5lZHUvZmFyZXdlbGxfYWRkcmVzc2VzLnBocCIpCiMgR2V0IGxpbmsgVVJMcwpmYXJld2VsbCA8LSBmLnNwZWVjaGxpbmtzKG1haW4ucGFnZSkKCiMgcHJlcGFyZWQgQ1NWIGRhdGEgc2V0cyBmb3IgdGhlIHNwZWVjaGVzIHdlIHdpbGwgc2NyYXAuIAoKaW5hdWcubGlzdD1yZWFkLmNzdigiLi4vZGF0YS9pbmF1Z2xpc3QuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpub21pbi5saXN0PXJlYWQuY3N2KCIuLi9kYXRhL25vbWlubGlzdC5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmZhcmV3ZWxsLmxpc3Q9cmVhZC5jc3YoIi4uL2RhdGEvZmFyZXdlbGxsaXN0LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCiMgV2UgYXNzZW1ibGUgYWxsIHNjcmFwcGVkIHNwZWVjaGVzIGludG8gb25lIGxpc3QuIE5vdGUgaGVyZSB0aGF0IHdlIGRvbid0IGhhdmUgdGhlIGZ1bGwgdGV4dCB5ZXQsIG9ubHkgdGhlIGxpbmtzIHRvIGZ1bGwgdGV4dCB0cmFuc2NyaXB0cy4gCgojIHNjcmFwIHRoZSB0ZXh0cyBvZiBzcGVlY2hlcyBmcm9tIHRoZSBzcGVlY2ggVVJMcy4KCm5vbWluPW5vbWluWy00NywgXQpzcGVlY2gubGlzdD1yYmluZChpbmF1Zy5saXN0LCBub21pbi5saXN0LCBmYXJld2VsbC5saXN0KQpzcGVlY2gubGlzdCR0eXBlPWMocmVwKCJpbmF1ZyIsIG5yb3coaW5hdWcubGlzdCkpLAogICAgICAgICAgICAgICAgICAgcmVwKCJub21pbiIsIG5yb3cobm9taW4ubGlzdCkpLAogICAgICAgICAgICAgICAgICAgcmVwKCJmYXJld2VsbCIsIG5yb3coZmFyZXdlbGwubGlzdCkpKQpzcGVlY2gudXJsPXJiaW5kKGluYXVnLCBub21pbiwgZmFyZXdlbGwpCnNwZWVjaC5saXN0PWNiaW5kKHNwZWVjaC5saXN0LCBzcGVlY2gudXJsKQoKIyBMb29wIG92ZXIgZWFjaCByb3cgaW4gc3BlZWNoLmxpc3QKc3BlZWNoLmxpc3QkZnVsbHRleHQ9TkEKZm9yKGkgaW4gc2VxKG5yb3coc3BlZWNoLmxpc3QpKSkgewogIHRleHQgPC0gcmVhZF9odG1sKHNwZWVjaC5saXN0JHVybHNbaV0pICU+JSAjIGxvYWQgdGhlIHBhZ2UKICAgIGh0bWxfbm9kZXMoIi5kaXNwbGF5dGV4dCIpICU+JSAjIGlzbG9hdGUgdGhlIHRleHQKICAgIGh0bWxfdGV4dCgpICMgZ2V0IHRoZSB0ZXh0CiAgc3BlZWNoLmxpc3QkZnVsbHRleHRbaV09dGV4dAogICMgQ3JlYXRlIHRoZSBmaWxlIG5hbWUKICBmaWxlbmFtZSA8LSBwYXN0ZTAoIi4uL2RhdGEvZnVsbHRleHQvIiwgCiAgICAgICAgICAgICAgICAgICAgIHNwZWVjaC5saXN0JHR5cGVbaV0sCiAgICAgICAgICAgICAgICAgICAgIHNwZWVjaC5saXN0JEZpbGVbaV0sICItIiwgCiAgICAgICAgICAgICAgICAgICAgIHNwZWVjaC5saXN0JFRlcm1baV0sICIudHh0IikKICBzaW5rKGZpbGUgPSBmaWxlbmFtZSkgJT4lICMgb3BlbiBmaWxlIHRvIHdyaXRlIAogIGNhdCh0ZXh0KSAgIyB3cml0ZSB0aGUgZmlsZQogIHNpbmsoKSAjIGNsb3NlIHRoZSBmaWxlCn0KCiMgY29tYmluZSB0aGUgc3BlZWNoZXMgb2YgRG9uYWxkVHJ1bXAKc3BlZWNoMT1wYXN0ZShyZWFkTGluZXMoIi4uL2RhdGEvZnVsbHRleHQvU3BlZWNoRG9uYWxkVHJ1bXAtTkEudHh0IiwgCiAgICAgICAgICAgICAgICAgIG49LTEsIHNraXBOdWw9VFJVRSksCiAgICAgICAgICAgICAgY29sbGFwc2U9IiAiKQpzcGVlY2gyPXBhc3RlKHJlYWRMaW5lcygiLi4vZGF0YS9mdWxsdGV4dC9TcGVlY2hEb25hbGRUcnVtcC1OQTIudHh0IiwgCiAgICAgICAgICAgICAgICAgIG49LTEsIHNraXBOdWw9VFJVRSksCiAgICAgICAgICAgICAgY29sbGFwc2U9IiAiKQpzcGVlY2gzPXBhc3RlKHJlYWRMaW5lcygiLi4vZGF0YS9mdWxsdGV4dC9QcmVzc0RvbmFsZFRydW1wLU5BLnR4dCIsIAogICAgICAgICAgICAgICAgICBuPS0xLCBza2lwTnVsPVRSVUUpLAogICAgICAgICAgICAgIGNvbGxhcHNlPSIgIikKClRydW1wLnNwZWVjaGVzPWRhdGEuZnJhbWUoCiAgUHJlc2lkZW50PXJlcCgiRG9uYWxkIEouIFRydW1wIiwgMyksCiAgRmlsZT1yZXAoIkRvbmFsZEpUcnVtcCIsIDMpLAogIFRlcm09cmVwKDAsIDMpLAogIFBhcnR5PXJlcCgiUmVwdWJsaWNhbiIsIDMpLAogIERhdGU9YygiQXVndXN0IDMxLCAyMDE2IiwgIlNlcHRlbWJlciA3LCAyMDE2IiwgIkphbnVhcnkgMTEsIDIwMTciKSwKICBXb3Jkcz1jKHdvcmRfY291bnQoc3BlZWNoMSksIHdvcmRfY291bnQoc3BlZWNoMiksIHdvcmRfY291bnQoc3BlZWNoMykpLAogIFdpbj1yZXAoInllcyIsIDMpLAogIHR5cGU9cmVwKCJzcGVlY2hlcyIsIDMpLAogIGxpbmtzPXJlcChOQSwgMyksCiAgdXJscz1yZXAoTkEsIDMpLAogIGZ1bGx0ZXh0PWMoc3BlZWNoMSwgc3BlZWNoMiwgc3BlZWNoMykKKQoKc3BlZWNoLmxpc3Q9cmJpbmQoc3BlZWNoLmxpc3QsIFRydW1wLnNwZWVjaGVzKQoKZm9yIChpIGluIDE6bnJvdyhzcGVlY2gubGlzdCkpIHsKICBzcGVlY2gubGlzdFtpLDZdID0gd2Moc3BlZWNoLmxpc3RbaSwxMV0pCn0jIGNvdW50IHRoZSB3b3JkcyBmb3IgZWFjaCBzcGVlY2gKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBsb29rIGF0IHRoZSBkYXRhIHdlIGhhdmUKaGVhZChzcGVlY2gubGlzdCkKYGBgCgojIyMgQWJvdmUgaXMgdGhlIGRhdGFzZXQgd2UgY29uc3RydWN0ZWQsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaW5hdWd1cmFsIHNwZWVjaCBsaWtlIFBhcnR5LCBudW1iZXIgb2Ygd29yZHMsIGRhdGUgYW5kIHNvIG9uLgoKCiMgUGFydCAxOiBUaGUgc3Rvcnkgb2YgaW5hdWd1cmFsIHNwZWVjaGVzIG9mIERlbW9jcmF0aWMgUGFydHkgYW5kIFJlcHVibGljYW4gUGFydHkKCiMjIyBJdCBpcyB3ZWxsIGtub3duIHRoYXQgRGVtb2NyYXRzIGFuZCByZXB1YmxpY2FucyBoYXZlIGRpZmZlcmVudCBwbGF0Zm9ybXMsIGRldmVsb3BtZW50IGdvYWxzIGFuZCBkaWZmZXJlbnQgaW50ZXJlc3RzLiBTbyB3aGF0IGFyZSB0aGUgc2ltaWxhcml0aWVzIGFuZCBkaWZmZXJlbmNlcyBvZiB0aGVpciBzcGVlY2hlcz8KCiMjIDEuMSBUaGUgY2hhbmdlIG9mIG51bWJlciBvZiB3b3JkcyBvdmVyIHRpbWUKCmBgYHtyLCBlY2hvPUZBTFNFfQojIGxvb2sgYXQgdGhlIGNoYW5nZSBvZiBudW1iZXIgb2Ygd29yZHMgb3ZlciB0aW1lCmRlbS5zcGVlY2gubGlzdD1zdWJzZXQoc3BlZWNoLmxpc3QsIFBhcnR5PT0nRGVtb2NyYXRpYycpCnJlcC5zcGVlY2gubGlzdD1zdWJzZXQoc3BlZWNoLmxpc3QsIFBhcnR5PT0nUmVwdWJsaWNhbicpCgojIERlbW9jcmF0aWMgcHJlc2lkZW50cwpiYXJwbG90KGFzLmludGVnZXIoZGVtLnNwZWVjaC5saXN0JFdvcmRzKSwgeWxhYiA9ICdXb3JkcycsY29sID0gInBpbmsiLAptYWluID0gIk51bWJlciBvZiB3b3JkcyBvZiBEZW1vY3JhdGljIHByZXNpZGVudHMnIHNwZWVjaGVzIikKCiMgUmVwdWJsaWNhbiBwcmVzaWRlbnRzCmJhcnBsb3QoYXMuaW50ZWdlcihyZXAuc3BlZWNoLmxpc3QkV29yZHMpLCB5bGFiID0gJ1dvcmRzJyxjb2wgPSAibGlnaHQgYmx1ZSIsCm1haW4gPSAiTnVtYmVyIG9mIHdvcmRzIG9mIFJlcHVibGljYW4gcHJlc2lkZW50cycgc3BlZWNoZXMiKQpgYGAKCiMjIyBBY2NvcmRpbmcgdG8gdGhlIGJhcnBsb3QgYWJvdmUsIHdlIG1heSBzZWUgdGhhdDoKIyMjIEZvciBEZW1vY3JhdGljIHByZXNpZGVudHMnIHNwZWVjaGVzOgojIyMgKDEpIE1vc3Qgb2YgdGhlIHNwZWVjaGVzIGFyZSB1bmRlciA0MDAwIHdvcmRzLgojIyMgKDIpIFRoZSBudW1iZXIgb2Ygd29yZHMgZmx1Y3R1YXRlIG92ZXIgdGltZS4KIyMjICgzKSBBcyB0aW1lIGdvZXMgYnksIHRoZXJlIGlzIGEgc2xpZ2h0IHRyZW5kIHRoYXQgdGhlaXIgc3BlZWNoZXMgY29udGFpbiBtb3JlIGFuZCBtb3JlIHdvcmRzLgoKIyMjIEZvciBSZXB1YmxpY2FuIHByZXNpZGVudHMnIHNwZWVjaGVzOgojIyMgKDEpIE1vc3Qgb2YgdGhlIHNwZWVjaGVzIGFyZSB1bmRlciA1MDAwIHdvcmRzLgojIyMgKDIpIFRoZSBudW1iZXIgb2Ygd29yZHMgZmx1Y3R1YXRlIG92ZXIgdGltZS4KIyMjICgzKSBBcyB0aW1lIGdvZXMgYnksIHRoZXJlIGlzIGEgc2xpZ2h0IHRyZW5kIHRoYXQgdGhlaXIgc3BlZWNoZXMgY29udGFpbiBtb3JlIGFuZCBtb3JlIHdvcmRzLgoKIyMjIEl0IHNlZW1zIGxpa2UgdGhhdCB0aGUgd29yZCBhdmVyYWdlIG51bWJlciBvZiBSZXB1YmxpY2FuIHByZXNpZGVudHMnIHNwZWVjaGVzIGlzIG1vcmUgdGhhbiB0aGF0IG9mIERlbW9jcmF0aWMgcHJlc2lkZW50cycgc3BlZWNoZXMuIElzIGl0IHJpZ2h0PwoKYGBge3IsIGVjaG89RkFMU0V9CiMgY29tcGFyZSB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygd29yZHMgZnJvbSBkaWZmZXJlbnQgUGFydHkKZGF0YSA9IGMobWVhbihhcy5pbnRlZ2VyKGRlbS5zcGVlY2gubGlzdCRXb3JkcykpLCBtZWFuKGFzLmludGVnZXIocmVwLnNwZWVjaC5saXN0JFdvcmRzKSkpCm5hbWUgPSBjKCdEZW1vY3JhdGljJywgJ1JlcHVibGljYW4nKQpiYXJwbG90KGRhdGEsIG5hbWVzLmFyZyA9IG5hbWUsIHhsYWIgPSAnUGFydHknLCB5bGFiID0gJ0F2ZXJhZ2UgV29yZHMnLGNvbCA9ICJncmV5IiwKbWFpbiA9ICJBdmVyYWdlIG51bWJlciBvZiB3b3JkcyBvZiBwcmVzaWRlbnRzJyBzcGVlY2hlcyIpCmBgYAoKIyMjIEFjY29yZGluZyB0byB0aGUgZ3JhcGggYWJvdmUsIHdlIGNhbiBzZWUgdGhhdCB0aGUgYXZlcmFnZSB3b3JkIG51bWJlciBvZiBEZW1vY3JhdGljIHByZXNpZGVudHMnIHNwZWVjaGVzIGlzIGFib3V0IDMwMDAuIEFzIGZvciBSZXB1YmxpY2FuIHByZXNpZGVudHMnIHNwZWVjaGVzLCBpdCBpcyBhYm91dCAzNTAwLiBTbyB3ZSBoYXZlIHRoZSByaWdodCBndWVzcy4KCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGdlbmVyYXRlIGxpc3Qgb2Ygc2VudGVuY2VzCgpzZW50ZW5jZS5saXN0PU5VTEwKZm9yKGkgaW4gMTpucm93KHNwZWVjaC5saXN0KSl7CiAgc2VudGVuY2VzPXNlbnRfZGV0ZWN0KHNwZWVjaC5saXN0JGZ1bGx0ZXh0W2ldLAogICAgICAgICAgICAgICAgICAgICAgICBlbmRtYXJrcyA9IGMoIj8iLCAiLiIsICIhIiwgInwiLCI7IikpCiAgaWYobGVuZ3RoKHNlbnRlbmNlcyk+MCl7CiAgICBlbW90aW9ucz1nZXRfbnJjX3NlbnRpbWVudChzZW50ZW5jZXMpCiAgICB3b3JkLmNvdW50PXdvcmRfY291bnQoc2VudGVuY2VzKQogICAgZW1vdGlvbnM9ZGlhZygxLyh3b3JkLmNvdW50KzAuMDEpKSUqJWFzLm1hdHJpeChlbW90aW9ucykKICAgIHNlbnRlbmNlLmxpc3Q9cmJpbmQoc2VudGVuY2UubGlzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHNwZWVjaC5saXN0W2ksLW5jb2woc3BlZWNoLmxpc3QpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGVuY2VzPWFzLmNoYXJhY3RlcihzZW50ZW5jZXMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQuaWQ9MTpsZW5ndGgoc2VudGVuY2VzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICApCiAgfQp9CgojIFNvbWUgbm9uLXNlbnRlbmNlcyBleGlzdCBpbiByYXcgZGF0YSBkdWUgdG8gZXJyb25lb3VzIGV4dHJhIGVuZC1vZi1zZW50ZW5jZSBtYXJrcy4gCnNlbnRlbmNlLmxpc3Q9CiAgc2VudGVuY2UubGlzdCU+JQogIGZpbHRlcighaXMubmEod29yZC5jb3VudCkpIApgYGAKCiMjIDEuMiBPdmVydmlldyBvZiBzZW50ZW5jZSBsZW5ndGggZGlzdHJpYnV0aW9uIGJ5IGRpZmZlcmVudCBQYXJ0eSBvZiBzcGVlY2hlcwoKIyMjIEZvciBzaW1wbGVyIHZpc3VhbGl6YXRpb24sIHdlIGNob3NlIGEgc3Vic2V0IG9mIGJldHRlciBrbm93biBwcmVzaWRlbnRzIG9yIHByZXNpZGVudGlhbCBjYW5kaWRhdGVzIG9uIHdoaWNoIHRvIGZvY3VzIG91ciBhbmFseXNpcy4gCgpgYGB7ciwgZWNobz1GQUxTRX0Kc2VsLmNvbXBhcmlzb249YygiRG9uYWxkSlRydW1wIiwiSm9obk1jQ2FpbiIsICJHZW9yZ2VCdXNoIiwgIk1pdHRSb21uZXkiLCAiR2VvcmdlV0J1c2giLAogICAgICAgICAgICAgICAgICJSb25hbGRSZWFnYW4iLCJBbGJlcnRHb3JlLEpyIiwgIkhpbGxhcnlDbGludG9uIiwiSm9obkZLZXJyeSIsIAogICAgICAgICAgICAgICAgICJXaWxsaWFtSkNsaW50b24iLCJIYXJyeVNUcnVtYW4iLCAiQmFyYWNrT2JhbWEiLCAiTHluZG9uQkpvaG5zb24iLAogICAgICAgICAgICAgICAgICJHZXJhbGRSRm9yZCIsICJKaW1teUNhcnRlciIsICJEd2lnaHRERWlzZW5ob3dlciIsICJGcmFua2xpbkRSb29zZXZlbHQiLAogICAgICAgICAgICAgICAgICJIZXJiZXJ0SG9vdmVyIiwiSm9obkZLZW5uZWR5IiwiUmljaGFyZE5peG9uIiwiV29vZHJvd1dpbHNvbiIsIAogICAgICAgICAgICAgICAgICJBYnJhaGFtTGluY29sbiIsICJUaGVvZG9yZVJvb3NldmVsdCIsICJKYW1lc0dhcmZpZWxkIiwgCiAgICAgICAgICAgICAgICAgIkpvaG5RdWluY3lBZGFtcyIsICJVbHlzc2VzU0dyYW50IiwgIlRob21hc0plZmZlcnNvbiIsCiAgICAgICAgICAgICAgICAgIkdlb3JnZVdhc2hpbmd0b24iLCAiV2lsbGlhbUhvd2FyZFRhZnQiLCAiQW5kcmV3SmFja3NvbiIsCiAgICAgICAgICAgICAgICAgIldpbGxpYW1IZW5yeUhhcnJpc29uIiwgIkpvaG5BZGFtcyIpCgpwcmludChzZWwuY29tcGFyaXNvbikKYGBgCgojIyMgVGhlc2UgYXJlIHRoZSBwcmVzaWRuZXRzIHdlIGNob3NlLgoKIyMjIEZvciByZWxldmFudCB0byBUcnVtcCdzIHNwZWVjaGVzLCB3ZSB3aWxsIG9ubHkgY29tcGFyZSBzcGVlY2hlcyBmb3IgdGhlIGZpcnN0IHRlcm1zIG9mIGZvcm1lciBVLlMuIHByZXNpZGVudHMuIAoKCiMjIDEuMi4xIERlbW9jcmF0aWMKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuaGVpZ2h0ID0gMywgZWNobz1GQUxTRX0KCnBhcihtYXI9Yyg0LCAxMSwgMiwgMikpCgpzZW50ZW5jZS5saXN0LnNlbD1maWx0ZXIoc2VudGVuY2UubGlzdCwgUGFydHk9PSdEZW1vY3JhdGljJywKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT09ImluYXVnIiwgVGVybT09MSwgRmlsZSVpbiVzZWwuY29tcGFyaXNvbikKc2VudGVuY2UubGlzdC5zZWwkRmlsZT1mYWN0b3Ioc2VudGVuY2UubGlzdC5zZWwkRmlsZSkKCnNlbnRlbmNlLmxpc3Quc2VsJEZpbGVPcmRlcmVkPXJlb3JkZXIoc2VudGVuY2UubGlzdC5zZWwkRmlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50ZW5jZS5saXN0LnNlbCR3b3JkLmNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI9VCkKCmJlZXN3YXJtKHdvcmQuY291bnR+RmlsZU9yZGVyZWQsIAogICAgICAgICBkYXRhPXNlbnRlbmNlLmxpc3Quc2VsLAogICAgICAgICBob3Jpem9udGFsID0gVFJVRSwgCiAgICAgICAgIHBjaD0xNiwgY29sPWFscGhhKGJyZXdlci5wYWwoOSwgIlNldDEiKSwgMC42KSwgCiAgICAgICAgIGNleD0wLjU1LCBjZXguYXhpcz0wLjgsIGNleC5sYWI9MC44LAogICAgICAgICBzcGFjaW5nPTUvbmxldmVscyhzZW50ZW5jZS5saXN0LnNlbCRGaWxlT3JkZXJlZCksCiAgICAgICAgIGxhcz0yLCB4bGFiPSJOdW1iZXIgb2Ygd29yZHMgaW4gYSBzZW50ZW5jZS4iLCB5bGFiPSIiLAogICAgICAgICBtYWluPSJJbmF1Z3VyYWwgc3BlZWNoZXMiKQoKYGBgCgojIyMgV2UgbWF5IG5vdGljZSB0aGF0IG1vc3Qgb2YgdGhlaXIgc2VudGVuY2VzIGFyZSBiZXR3ZWVuIDEgYW5kIDMwIHdvcmRzLiBUaGUgZGlzdHJpYnV0aW9uIG9mIG51bWJlciBvZiB3b3JkcyBpbiBhIHNlbnRlbmNlIGlzIHJlbGF0aXZlbHkgc21vb3RoIGFuZCBhdmVyYWdlLgoKCiMjIDEuMi4yIFJlcHVibGljYW4KCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuaGVpZ2h0ID0gMywgZWNobz1GQUxTRX0KCnBhcihtYXI9Yyg0LCAxMSwgMiwgMikpCnNlbnRlbmNlLmxpc3Quc2VsPWZpbHRlcihzZW50ZW5jZS5saXN0LCBQYXJ0eT09J1JlcHVibGljYW4nLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlPT0iaW5hdWciLCBUZXJtPT0xLCBGaWxlJWluJXNlbC5jb21wYXJpc29uKQpzZW50ZW5jZS5saXN0LnNlbCRGaWxlPWZhY3RvcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlKQoKc2VudGVuY2UubGlzdC5zZWwkRmlsZU9yZGVyZWQ9cmVvcmRlcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRlbmNlLmxpc3Quc2VsJHdvcmQuY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcj1UKQoKYmVlc3dhcm0od29yZC5jb3VudH5GaWxlT3JkZXJlZCwgCiAgICAgICAgIGRhdGE9c2VudGVuY2UubGlzdC5zZWwsCiAgICAgICAgIGhvcml6b250YWwgPSBUUlVFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YWxwaGEoYnJld2VyLnBhbCg5LCAiU2V0MSIpLCAwLjYpLCAKICAgICAgICAgY2V4PTAuNTUsIGNleC5heGlzPTAuOCwgY2V4LmxhYj0wLjgsCiAgICAgICAgIHNwYWNpbmc9NS9ubGV2ZWxzKHNlbnRlbmNlLmxpc3Quc2VsJEZpbGVPcmRlcmVkKSwKICAgICAgICAgbGFzPTIsIHhsYWI9Ik51bWJlciBvZiB3b3JkcyBpbiBhIHNlbnRlbmNlLiIsIHlsYWI9IiIsCiAgICAgICAgIG1haW49IkluYXVndXJhbCBzcGVlY2hlcyIpCgpgYGAKIyMjIEFzIGZvciBSZXB1YmxpY2FuIHByZXNpZGVudHMsIHdlIGZpbmQgdGhhdCB0aGV5IGhhdmUgbW9yZSBzZW50ZW5jZXMgdW5kZXIgMjAgd29yZHMuIFNvIG1vc3Qgb2YgdGhlaXIgcG9pbnRzIGNvbmNlbnRyYXRlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGdyYXBoLgoKCiMjIDEuMyBDbHVzdGVyaW5nIG9mIGVtb3Rpb25zCgpgYGB7ciwgZmlnLmhlaWdodD0zLjMsIGZpZy53aWR0aD0zLjcsIGVjaG89RkFMU0V9CnByZXNpZC5zdW1tYXJ5PXRibF9kZihzZW50ZW5jZS5saXN0KSU+JQogIGZpbHRlcih0eXBlPT0iaW5hdWciLCBGaWxlJWluJXNlbC5jb21wYXJpc29uKSU+JQogIGdyb3VwX2J5KEZpbGUpJT4lCiAgc3VtbWFyaXNlKAogICAgYW5nZXI9bWVhbihhbmdlciksCiAgICBhbnRpY2lwYXRpb249bWVhbihhbnRpY2lwYXRpb24pLAogICAgZGlzZ3VzdD1tZWFuKGRpc2d1c3QpLAogICAgZmVhcj1tZWFuKGZlYXIpLAogICAgam95PW1lYW4oam95KSwKICAgIHNhZG5lc3M9bWVhbihzYWRuZXNzKSwKICAgIHN1cnByaXNlPW1lYW4oc3VycHJpc2UpLAogICAgdHJ1c3Q9bWVhbih0cnVzdCksCiAgICBuZWdhdGl2ZT1tZWFuKG5lZ2F0aXZlKSwKICAgIHBvc2l0aXZlPW1lYW4ocG9zaXRpdmUpCiAgKQoKcHJlc2lkLnN1bW1hcnk9YXMuZGF0YS5mcmFtZShwcmVzaWQuc3VtbWFyeSkKcm93bmFtZXMocHJlc2lkLnN1bW1hcnkpPWFzLmNoYXJhY3RlcigocHJlc2lkLnN1bW1hcnlbLDFdKSkKa20ucmVzPWttZWFucyhwcmVzaWQuc3VtbWFyeVssLTFdLCBpdGVyLm1heD0yMDAsCiAgICAgICAgICAgICAgNSkKZnZpel9jbHVzdGVyKGttLnJlcywgCiAgICAgICAgICAgICBzdGFuZD1GLCByZXBlbD0gVFJVRSwKICAgICAgICAgICAgIGRhdGEgPSBwcmVzaWQuc3VtbWFyeVssLTFdLCB4bGFiPSIiLCB4YXh0PSJuIiwKICAgICAgICAgICAgIHNob3cuY2x1c3QuY2VudD1GQUxTRSkKYGBgCiMjIyBCeSBjbHVzdGVyaW5nIG9mIGVtb3Rpb25zIG9mIGFsbCB0aGVzZSBjaG9zZW4gc3BlZWNoZXMgZnJvbSBkaWZmZXJlbnQgUGFydHksIHdlIGNhbiBzZWUgdGhhdDoKIyMjICgxKSBUaGUgc3BlZWNoZXMgZnJvbSBkaWZmZXJlbnQgUGFydHkgbWF5IGJlIGluIHRoZSBzYW1lIGVtb3Rpb24gY2x1c3RlciwgbGlrZSBXaWxsaWFtIEhvd2FyZCBUYWZ0IGFuZCBCYXJhY2tPYmFtYS4KIyMjICgyKSBUaGUgc3BlZWNoZXMgZnJvbSB0aGUgc2FtZSBQYXJ0eSBtYXkgYmUgaW4gZGlmZmVyZW50IGVtb3Rpb24gY2x1c3RlciwgbGlrZSBGcmFua2xpbiBELiBSb29zZXZlbHQgYW5kIEJhcmFja09iYW1hLgoKIyMjIFdpdGggYWxsIHRoZSBmaW5kaW5nIHdlIGNvbmNsdWRlIGZyb20gcGFydCAxLCBuZXh0IHdlIHdpbGwgZm9jdXMgb24gdGhlIGRpZmZlcmVuY2Ugb2Ygc3BlZWNoZXMgYmV0d2VlbiBEb25hbGRKVHJ1bXAgYW5kIEJhcmFja09iYW1hLgoKCiMgUGFydCAyOiBUaGUgc3Rvcnkgb2YgaW5hdWd1cmFsIHNwZWVjaGVzIG9mIERvbmFsZEpUcnVtcCBhbmQgQmFyYWNrT2JhbWEKCiMjIyBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGFyZSBsb3RzIG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gRG9uYWxkSlRydW1wIGFuZCBCYXJhY2tPYmFtYSwgYWdlcywgUGFydGllcywgZXhwZXJpZW5jZSBhbmQgc28gb24uIEhvdyBhYm91dCB0aGVpciBpbmF1Z3VyYWwgc3BlZWNoZXM/CgojIyAyLjEgT3ZlcnZpZXcgb2Ygc2VudGVuY2UgbGVuZ3RoIGRpc3RyaWJ1dGlvbgoKIyMjIEZvciByZWxldmFudCB0byBUcnVtcCdzIHNwZWVjaGVzLCB3ZSB3aWxsIG9ubHkgY29tcGFyZSBzcGVlY2hlcyBmb3IgdGhlIGZpcnN0IHRlcm1zIG9mIGZvcm1lciBVLlMuIHByZXNpZGVudHMuCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmhlaWdodCA9IDIsIGVjaG89RkFMU0V9CgpzZWwuY29tcGFyaXNvbjI9YygiRG9uYWxkSlRydW1wIiwgIkJhcmFja09iYW1hIikKCnBhcihtYXI9Yyg0LCAxMSwgMiwgMikpCgpzZW50ZW5jZS5saXN0LnNlbD1maWx0ZXIoc2VudGVuY2UubGlzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9PSJpbmF1ZyIsIFRlcm09PTEsIEZpbGUlaW4lc2VsLmNvbXBhcmlzb24yKQpzZW50ZW5jZS5saXN0LnNlbCRGaWxlPWZhY3RvcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlKQoKc2VudGVuY2UubGlzdC5zZWwkRmlsZU9yZGVyZWQ9cmVvcmRlcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRlbmNlLmxpc3Quc2VsJHdvcmQuY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcj1UKQoKYmVlc3dhcm0od29yZC5jb3VudH5GaWxlT3JkZXJlZCwgCiAgICAgICAgIGRhdGE9c2VudGVuY2UubGlzdC5zZWwsCiAgICAgICAgIGhvcml6b250YWwgPSBUUlVFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YWxwaGEoYnJld2VyLnBhbCg5LCAiU2V0MSIpLCAwLjYpLCAKICAgICAgICAgY2V4PTAuNTUsIGNleC5heGlzPTAuOCwgY2V4LmxhYj0wLjgsCiAgICAgICAgIHNwYWNpbmc9NS9ubGV2ZWxzKHNlbnRlbmNlLmxpc3Quc2VsJEZpbGVPcmRlcmVkKSwKICAgICAgICAgbGFzPTIsIHhsYWI9Ik51bWJlciBvZiB3b3JkcyBpbiBhIHNlbnRlbmNlLiIsIHlsYWI9IiIsCiAgICAgICAgIG1haW49IkluYXVndXJhbCBzcGVlY2hlcyIpCgpgYGAKCiMjIyBJdCBpcyBvYnZpb3VzIHRoYXQgRG9uYWxkSlRydW1wIGhhcyBtb3JlIHNob3J0IHNlbnRlbmNlcyB0aGFuIEJhcmFja09iYW1hLiBCYXJhY2tPYmFtYSBoYXMgbG90cyBvZiBzZW50ZW5jZXMgd2l0aCBtb3JlIHRoYW4gMjUgd29yZHMuCgojIyMgU28gd2lsbCB0aGUgbnVtYmVyIG9mIHdvcmRzIGJlIGRpZmZlcmVudD8KCmBgYHtyLCBlY2hvPUZBTFNFfQojIGNvbXBhcmUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHNwZWVjaCBvZiBUcnVtcCBhbmQgT2JhbWEKd29yZD1jKG1lYW4oYXMuaW50ZWdlcihzcGVlY2gubGlzdFtzcGVlY2gubGlzdCRQcmVzaWRlbnQ9PSdEb25hbGQgSi4gVHJ1bXAnLCBdJFdvcmRzKSksIG1lYW4oYXMuaW50ZWdlcihzcGVlY2gubGlzdFtzcGVlY2gubGlzdCRQcmVzaWRlbnQ9PSdCYXJhY2sgT2JhbWEnLCBdJFdvcmRzKSkpCnByZT1jKCJEb25hbGRKVHJ1bXAiLCAiQmFyYWNrT2JhbWEiKQpiYXJwbG90KHdvcmQsIG5hbWVzLmFyZyA9IHByZSwgeGxhYiA9ICdQcmVzaWRlbnQnLCB5bGFiID0gJ0F2ZXJhZ2UgV29yZHMnLGNvbCA9ICJncmV5IiwKbWFpbiA9ICJOdW1iZXIgb2Ygd29yZHMgb2YgcHJlc2lkZW50cycgc3BlZWNoZXMiKQpgYGAKCiMjIyBBY2NvcmRpbmcgdG8gdGhlIGJhcnBsb3QgYWJvdmUsIHdlIGNhbiBmaW5kIHRoYXQgdGhlIHNwZWVjaGVzIG9mIERvbmFsZEpUcnVtcCBoYXMgYWJvdXQgNDMwMCB3b3Jkcy4gSG93ZXZlciwgdGhlIHNwZWVjaGVzIG9mIEJhcmFja09iYW1hIGhhcyBhYm91dCAzNjAwIHdvcmRzLCB3aGljaCBpcyBtdWNoIGxlc3MgdGhhbiBEb25hbGRKVHJ1bXAuCgoKIyMgMi4yIERvbmFsZEpUcnVtcCBWUyBCYXJhY2tPYmFtYSwgd2hhdCBhcmUgdGhlaXIgc2hvcnQgc2VudGVuY2VzPwoKYGBge3IsIGVjaG89RkFMU0V9CnNlbnRlbmNlLmxpc3QlPiUKICBmaWx0ZXIoRmlsZT09IkRvbmFsZEpUcnVtcCIsIAogICAgICAgICB0eXBlPT0iaW5hdWciLCAKICAgICAgICAgd29yZC5jb3VudDw9MyklPiUKICBzZWxlY3Qoc2VudGVuY2VzKQoKc2VudGVuY2UubGlzdCU+JQogIGZpbHRlcihGaWxlPT0iQmFyYWNrT2JhbWEiLCAKICAgICAgICAgdHlwZT09ImluYXVnIiwgCiAgICAgICAgIHdvcmQuY291bnQ8PTMpJT4lCiAgc2VsZWN0KHNlbnRlbmNlcykKYGBgCgojIyMgV2Ugd2lsbCBub3RpY2UgdGhhdCBtb3N0IG9mIHRoZWlyIHNob3J0IHNlbnRlbmNlcyBhcmUgc2ltaWxhciwgbGlrZSAnVGhhbmsgeW91Jy4gVGhlICdBbWVyaWNhIGZpcnN0JyBpbiBUcnVtcCdzIHNwZWVjaCBhbmQgdGhlICdkaXZlcnNpdHkgYW5kIG9wZW5uZXNzJyBpbiBPYmFtYSdzIHNwZWVjaCBzaG93IGEgYmlnIGRpZmZlcmVuY2UgaW4gdGhlaXIgY29uY2VwdCBvZiBydW5uaW5nIGEgY291bnRyeSwgZXNwZWNpYWxseSBpdHMgZXh0ZXJuYWwgYXR0aXR1ZGUuCgoKIyMgMi4zIFNlbnRpbWVudCBhbmFsc2lzCgojIyMgVGhlIGZvbGxvd2luZyBhbmFseXNpcyBzaG93cyB0aGF0IHNlbnRlbmNlIGxlbmd0aCB2YXJpYXRpb24gb3ZlciB0aGUgY291cnNlIG9mIHRoZSBzcGVlY2gsIHdpdGggZW1vdGlvbnMuIEhvdyB0aGUgcHJlc2lkZW50cyBhbHRlcm5hdGUgYmV0d2VlbiBsb25nIGFuZCBzaG9ydCBzZW50ZW5jZXMgYW5kIGhvdyB0aGV5IHNoaWZ0IGJldHdlZW4gZGlmZmVyZW50IHNlbnRpbWVudHMgaW4gdGhlaXIgc3BlZWNoZXMuIFdlIHVzZSB0aGUgc2FtZSBjb2xvciB0byBzaG93IHRoZSBzYW1lIGVtb3Rpb24uCgojIyAyLjMuMSBEb25hbGRKVHJ1bXAgVlMgQmFyYWNrT2JhbWEKCmBgYHtyLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD0yLCBlY2hvPUZBTFNFfQpwYXIobWZyb3c9YygyLDEpLCBtYXI9YygxLDAsMiwwKSwgYnR5PSJuIiwgeGF4dD0ibiIsIHlheHQ9Im4iLCBmb250Lm1haW49MSkKCmYucGxvdHNlbnQubGVuKEluLmxpc3Q9c2VudGVuY2UubGlzdCwgSW5GaWxlPSJEb25hbGRKVHJ1bXAiLCAKICAgICAgICAgICAgICAgSW5UeXBlPSJpbmF1ZyIsIEluVGVybT0xLCBQcmVzaWRlbnQ9IkRvbmFsZCBUcnVtcCIpCgpmLnBsb3RzZW50LmxlbihJbi5saXN0PXNlbnRlbmNlLmxpc3QsIEluRmlsZT0iQmFyYWNrT2JhbWEiLCAKICAgICAgICAgICAgICAgSW5UeXBlPSJpbmF1ZyIsIEluVGVybT0xLCBQcmVzaWRlbnQ9IkJhcmFjayBPYmFtYSIpCgpgYGAKCiMjIyBJdCBpcyBvYnZpb3VzIHRoYXQgdGhlIGVtb3Rpb24gb2YgVHJ1bXAncyBzZW50ZW5jZXMgYXJlIG1vcmUgZWFzaWx5IGNoYW5nZWQuIE9uIGNvbnRyYWN0LCB0aGUgZW1vdGlvbiBvZiBPYmFtYSdzIHNlbnRlbmNlcyBhcmUgbW9yZSBjb2hlcmVuY2UuCgojIyMgV2hhdCBhcmUgdGhlIGVtb3Rpb25hbGx5IGNoYXJnZWQgc2VudGVuY2VzPwoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CnByaW50KCJEb25hbGQgVHJ1bXAiKQpzcGVlY2guZGY9dGJsX2RmKHNlbnRlbmNlLmxpc3QpJT4lCiAgZmlsdGVyKEZpbGU9PSJEb25hbGRKVHJ1bXAiLCB0eXBlPT0iaW5hdWciLCBUZXJtPT0xLCB3b3JkLmNvdW50Pj01KSU+JQogIHNlbGVjdChzZW50ZW5jZXMsIGFuZ2VyOnRydXN0KQpzcGVlY2guZGY9YXMuZGF0YS5mcmFtZShzcGVlY2guZGYpCmFzLmNoYXJhY3RlcihzcGVlY2guZGYkc2VudGVuY2VzW2FwcGx5KHNwZWVjaC5kZlssLTFdLCAyLCB3aGljaC5tYXgpXSkKCnByaW50KCJCYXJhY2sgT2JhbWEiKQpzcGVlY2guZGY9dGJsX2RmKHNlbnRlbmNlLmxpc3QpJT4lCiAgZmlsdGVyKEZpbGU9PSJCYXJhY2tPYmFtYSIsIHR5cGU9PSJpbmF1ZyIsIFRlcm09PTEsIHdvcmQuY291bnQ+PTUpJT4lCiAgc2VsZWN0KHNlbnRlbmNlcywgYW5nZXI6dHJ1c3QpCnNwZWVjaC5kZj1hcy5kYXRhLmZyYW1lKHNwZWVjaC5kZikKYXMuY2hhcmFjdGVyKHNwZWVjaC5kZiRzZW50ZW5jZXNbYXBwbHkoc3BlZWNoLmRmWywtMV0sIDIsIHdoaWNoLm1heCldKQpgYGAKCiMjIyBGcm9tIHRoZSByZXN1bHQgYWJvdmUsIHdlIG1heSBmaW5kIHRoYXQgdGhlIGNoYW5nZSBvZiBlbW90aW9uIGlzIGtpbmQgb2YgcmVsYXRlZCB0byB0aGUgY2hhbmdlIG9mIHRvcGljcywgbGlrZSAnVG9kYXkncyBjZXJlbW9ueSwgaG93ZXZlciwgaGFzIHZlcnkgc3BlY2lhbCBtZWFuaW5nLicgYnkgVHJ1bXAuCgoKIyMgMi40IFRvcGljIG1vZGVsaW5nCgojIyMgRm9yIHRvcGljIG1vZGVsaW5nLCB3ZSBwcmVwYXJlIGEgY29ycHVzIG9mIHNlbnRlbmNlIHNuaXBldHMgYXMgZm9sbG93cy4gRm9yIGVhY2ggc3BlZWNoLCB3ZSBzdGFydCB3aXRoIHNlbnRlbmNlcyBhbmQgcHJlcGFyZSBhIHNuaXBldCB3aXRoIGEgZ2l2ZW4gc2VudGVuY2Ugd2l0aCB0aGUgZmxhbmtpbmcgc2VudGVuY2VzLiAKCiMjIyBCYXNlZCBvbiB0aGUgbW9zdCBwb3B1bGFyIHRlcm1zIGFuZCB0aGUgbW9zdCBzYWxpZW50IHRlcm1zIGZvciBlYWNoIHRvcGljLCB3ZSBhc3NpZ24gYSBoYXNodGFnIHRvIGVhY2ggdG9waWMuIFRoZXNlIHRvcGljcyBhcmUgIkVjb25vbXkiLCAiQW1lcmljYSIsICJEZWZlbnNlIiwgIkJlbGllZiIsICJFbGVjdGlvbiIsICJQYXRyaW90aXNtIiwgIlVuaXR5IiwgIkdvdmVybm1lbnQiLCAiUmVmb3JtIiwgIlRlbXBvcmFsIiwgIldvcmtpbmdGYW1pbGllcyIsICJGcmVlZG9tIiwgIkVxdWFsaXR5IiwgIk1pc2MiIGFuZCAiTGVnaXNsYXRpb24iLgoKYGBge3IsIGVjaG89RkFMU0V9CmNvcnB1cy5saXN0PXNlbnRlbmNlLmxpc3RbMjoobnJvdyhzZW50ZW5jZS5saXN0KS0xKSwgXQpzZW50ZW5jZS5wcmU9c2VudGVuY2UubGlzdCRzZW50ZW5jZXNbMToobnJvdyhzZW50ZW5jZS5saXN0KS0yKV0Kc2VudGVuY2UucG9zdD1zZW50ZW5jZS5saXN0JHNlbnRlbmNlc1szOihucm93KHNlbnRlbmNlLmxpc3QpLTEpXQpjb3JwdXMubGlzdCRzbmlwZXRzPXBhc3RlKHNlbnRlbmNlLnByZSwgY29ycHVzLmxpc3Qkc2VudGVuY2VzLCBzZW50ZW5jZS5wb3N0LCBzZXA9IiAiKQpybS5yb3dzPSgxOm5yb3coY29ycHVzLmxpc3QpKVtjb3JwdXMubGlzdCRzZW50LmlkPT0xXQpybS5yb3dzPWMocm0ucm93cywgcm0ucm93cy0xKQpjb3JwdXMubGlzdD1jb3JwdXMubGlzdFstcm0ucm93cywgXQoKIyBUZXh0IG1pbmluZwpkb2NzIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoY29ycHVzLmxpc3Qkc25pcGV0cykpCndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKGRvY3NbW3NhbXBsZSgxOm5yb3coY29ycHVzLmxpc3QpLCAxKV1dKSkKCiMgVGV4dCBiYXNpYyBwcm9jZXNzaW5nLCBhZGFwdGVkIGZyb20gPGh0dHBzOi8vZWlnaHQybGF0ZS53b3JkcHJlc3MuY29tLzIwMTUvMDkvMjkvYS1nZW50bGUtaW50cm9kdWN0aW9uLXRvLXRvcGljLW1vZGVsaW5nLXVzaW5nLXIvPi4KI3JlbW92ZSBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBzeW1ib2xzCmRvY3MgPC10bV9tYXAoZG9jcyxjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQp3cml0ZUxpbmVzKGFzLmNoYXJhY3Rlcihkb2NzW1tzYW1wbGUoMTpucm93KGNvcnB1cy5saXN0KSwgMSldXSkpCgojcmVtb3ZlIHB1bmN0dWF0aW9uCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZVB1bmN0dWF0aW9uKQp3cml0ZUxpbmVzKGFzLmNoYXJhY3Rlcihkb2NzW1tzYW1wbGUoMTpucm93KGNvcnB1cy5saXN0KSwgMSldXSkpCgojU3RyaXAgZGlnaXRzCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZU51bWJlcnMpCndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKGRvY3NbW3NhbXBsZSgxOm5yb3coY29ycHVzLmxpc3QpLCAxKV1dKSkKCiNyZW1vdmUgc3RvcHdvcmRzCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkKd3JpdGVMaW5lcyhhcy5jaGFyYWN0ZXIoZG9jc1tbc2FtcGxlKDE6bnJvdyhjb3JwdXMubGlzdCksIDEpXV0pKQoKI3JlbW92ZSB3aGl0ZXNwYWNlCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHN0cmlwV2hpdGVzcGFjZSkKd3JpdGVMaW5lcyhhcy5jaGFyYWN0ZXIoZG9jc1tbc2FtcGxlKDE6bnJvdyhjb3JwdXMubGlzdCksIDEpXV0pKQoKI1N0ZW0gZG9jdW1lbnQKZG9jcyA8LSB0bV9tYXAoZG9jcyxzdGVtRG9jdW1lbnQpCndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKGRvY3NbW3NhbXBsZSgxOm5yb3coY29ycHVzLmxpc3QpLCAxKV1dKSkKCiNHZW5nZXJhdGUgZG9jdW1lbnQtdGVybSBtYXRyaWNlcy4gCmR0bSA8LSBEb2N1bWVudFRlcm1NYXRyaXgoZG9jcykKI2NvbnZlcnQgcm93bmFtZXMgdG8gZmlsZW5hbWVzI2NvbnZlcnQgcm93bmFtZXMgdG8gZmlsZW5hbWVzCnJvd25hbWVzKGR0bSkgPC0gcGFzdGUoY29ycHVzLmxpc3QkdHlwZSwgY29ycHVzLmxpc3QkRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICBjb3JwdXMubGlzdCRUZXJtLCBjb3JwdXMubGlzdCRzZW50LmlkLCBzZXA9Il8iKQoKcm93VG90YWxzIDwtIGFwcGx5KGR0bSAsIDEsIHN1bSkgI0ZpbmQgdGhlIHN1bSBvZiB3b3JkcyBpbiBlYWNoIERvY3VtZW50CgpkdG0gIDwtIGR0bVtyb3dUb3RhbHM+IDAsIF0KY29ycHVzLmxpc3Q9Y29ycHVzLmxpc3Rbcm93VG90YWxzPjAsIF0KCiNSdW4gTERBCiNTZXQgcGFyYW1ldGVycyBmb3IgR2liYnMgc2FtcGxpbmcKYnVybmluIDwtIDQwMDAKaXRlciA8LSAyMDAwCnRoaW4gPC0gNTAwCnNlZWQgPC1saXN0KDIwMDMsNSw2MywxMDAwMDEsNzY1KQpuc3RhcnQgPC0gNQpiZXN0IDwtIFRSVUUKCiNOdW1iZXIgb2YgdG9waWNzCmsgPC0gMTUKCiNSdW4gTERBIHVzaW5nIEdpYmJzIHNhbXBsaW5nCmxkYU91dCA8LUxEQShkdG0sIGssIG1ldGhvZD0iR2liYnMiLCBjb250cm9sPWxpc3QobnN0YXJ0PW5zdGFydCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gc2VlZCwgYmVzdD1iZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVybmluID0gYnVybmluLCBpdGVyID0gaXRlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluPXRoaW4pKQojd3JpdGUgb3V0IHJlc3VsdHMKI2RvY3MgdG8gdG9waWNzCmxkYU91dC50b3BpY3MgPC0gYXMubWF0cml4KHRvcGljcyhsZGFPdXQpKQp0YWJsZShjKDE6aywgbGRhT3V0LnRvcGljcykpCndyaXRlLmNzdihsZGFPdXQudG9waWNzLGZpbGU9cGFzdGUoIi4uL291dHB1dC9MREFHaWJicyIsaywiRG9jc1RvVG9waWNzLmNzdiIpKQoKI3RvcCA2IHRlcm1zIGluIGVhY2ggdG9waWMKbGRhT3V0LnRlcm1zIDwtIGFzLm1hdHJpeCh0ZXJtcyhsZGFPdXQsMjApKQp3cml0ZS5jc3YobGRhT3V0LnRlcm1zLGZpbGU9cGFzdGUoIi4uL291dHB1dC9MREFHaWJicyIsaywiVG9waWNzVG9UZXJtcy5jc3YiKSkKCiNwcm9iYWJpbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRvcGljIGFzc2lnbm1lbnQKdG9waWNQcm9iYWJpbGl0aWVzIDwtIGFzLmRhdGEuZnJhbWUobGRhT3V0QGdhbW1hKQp3cml0ZS5jc3YodG9waWNQcm9iYWJpbGl0aWVzLGZpbGU9cGFzdGUoIi4uL291dHB1dC9MREFHaWJicyIsaywiVG9waWNQcm9iYWJpbGl0aWVzLmNzdiIpKQoKdGVybXMuYmV0YT1sZGFPdXRAYmV0YQp0ZXJtcy5iZXRhPXNjYWxlKHRlcm1zLmJldGEpCnRvcGljcy50ZXJtcz1OVUxMCmZvcihpIGluIDE6ayl7CiAgdG9waWNzLnRlcm1zPXJiaW5kKHRvcGljcy50ZXJtcywgbGRhT3V0QHRlcm1zW29yZGVyKHRlcm1zLmJldGFbaSxdLCBkZWNyZWFzaW5nID0gVFJVRSlbMTo3XV0pCn0KdG9waWNzLnRlcm1zCmxkYU91dC50ZXJtcwoKdG9waWNzLmhhc2g9YygiRWNvbm9teSIsICJBbWVyaWNhIiwgIkRlZmVuc2UiLCAiQmVsaWVmIiwgIkVsZWN0aW9uIiwgIlBhdHJpb3Rpc20iLCAiVW5pdHkiLCAiR292ZXJubWVudCIsICJSZWZvcm0iLCAiVGVtcG9yYWwiLCAiV29ya2luZ0ZhbWlsaWVzIiwgIkZyZWVkb20iLCAiRXF1YWxpdHkiLCAiTWlzYyIsICJMZWdpc2xhdGlvbiIpCmNvcnB1cy5saXN0JGxkYXRvcGljPWFzLnZlY3RvcihsZGFPdXQudG9waWNzKQpjb3JwdXMubGlzdCRsZGFoYXNoPXRvcGljcy5oYXNoW2xkYU91dC50b3BpY3NdCgpjb2xuYW1lcyh0b3BpY1Byb2JhYmlsaXRpZXMpPXRvcGljcy5oYXNoCmNvcnB1cy5saXN0LmRmPWNiaW5kKGNvcnB1cy5saXN0LCB0b3BpY1Byb2JhYmlsaXRpZXMpCmBgYAoKCiMjIDIuNC4xIFRvcGljcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIFRydW1wIGFuZCBPYmFtYQoKYGBge3IsIGZpZy53aWR0aD0zLjMsIGZpZy5oZWlnaHQ9MywgZWNobz1GQUxTRX0KIyBbMV0gIkVjb25vbXkiICAgICAgICAgIkFtZXJpY2EiICAgICAgICAgIkRlZmVuc2UiICAgICAgICAgIkJlbGllZiIgICAgICAgICAKIyBbNV0gIkVsZWN0aW9uIiAgICAgICAgIlBhdHJpb3Rpc20iICAgICAgIlVuaXR5IiAgICAgICAgICAgIkdvdmVybm1lbnQiICAgICAKIyBbOV0gIlJlZm9ybSIgICAgICAgICAgIlRlbXBvcmFsIiAgICAgICAgIldvcmtpbmdGYW1pbGllcyIgIkZyZWVkb20iICAgICAgICAKIyBbMTNdICJFcXVhbGl0eSIgICAgICAgICJNaXNjIiAgICAgICAgICAgICJMZWdpc2xhdGlvbiIgICAgICAgCgpwYXIobWZyb3c9YygyLCAxKSwgbWFyPWMoMSwxLDIsMCksIGJ0eT0ibiIsIHhheHQ9Im4iLCB5YXh0PSJuIikKCnRvcGljLnBsb3Q9YygxOjE1KQpwcmludCh0b3BpY3MuaGFzaFt0b3BpYy5wbG90XSkKIApzcGVlY2guZGY9dGJsX2RmKGNvcnB1cy5saXN0LmRmKSU+JWZpbHRlcihGaWxlPT0iRG9uYWxkSlRydW1wIiwgdHlwZT09ImluYXVnIiklPiVzZWxlY3Qoc2VudC5pZCwgRWNvbm9teTpMZWdpc2xhdGlvbikKc3BlZWNoLmRmPWFzLm1hdHJpeChzcGVlY2guZGYpCnNwZWVjaC5kZlssLTFdPXJlcGxhY2Uoc3BlZWNoLmRmWywtMV0sIHNwZWVjaC5kZlssLTFdPDEvMTUsIDAuMDAxKQpzcGVlY2guZGZbLC0xXT1mLnNtb290aC50b3BpYyh4PXNwZWVjaC5kZlssMV0sIHk9c3BlZWNoLmRmWywtMV0pCnBsb3Quc3RhY2tlZChzcGVlY2guZGZbLDFdLCBzcGVlY2guZGZbLHRvcGljLnBsb3QrMV0sCiAgICAgICAgICAgIHhsYWI9IlNlbnRlbmNlcyIsIHlsYWI9IlRvcGljIHNoYXJlIiwgbWFpbj0iRG9uYWxkIFRydW1wLCAgSW5hdWd1cmFsIFNwZWVjaGVzIikKCnNwZWVjaC5kZj10YmxfZGYoY29ycHVzLmxpc3QuZGYpJT4lZmlsdGVyKEZpbGU9PSJCYXJhY2tPYmFtYSIsIHR5cGU9PSJpbmF1ZyIsIFRlcm09PTEpJT4lc2VsZWN0KHNlbnQuaWQsIEVjb25vbXk6TGVnaXNsYXRpb24pCnNwZWVjaC5kZj1hcy5tYXRyaXgoc3BlZWNoLmRmKQpzcGVlY2guZGZbLC0xXT1yZXBsYWNlKHNwZWVjaC5kZlssLTFdLCBzcGVlY2guZGZbLC0xXTwxLzE1LCAwLjAwMSkKc3BlZWNoLmRmWywtMV09Zi5zbW9vdGgudG9waWMoeD1zcGVlY2guZGZbLDFdLCB5PXNwZWVjaC5kZlssLTFdKQpwbG90LnN0YWNrZWQoc3BlZWNoLmRmWywxXSwgc3BlZWNoLmRmWyx0b3BpYy5wbG90KzFdLAogICAgICAgICAgICAgeGxhYj0iU2VudGVuY2VzIiwgeWxhYj0iVG9waWMgc2hhcmUiLCBtYWluPSJCYXJhY2sgT2JhbWEsIEluYXVndXJhbCBTcGVlY2hlcyIpCmBgYAoKIyMjIEFjY29yZGluZyB0byB0aGUgcmVzdWx0LCB3ZSBtYXkgZmluZCB0aGF0OgojIyMgKDEpIEZvciBEb25hbGRKVHJ1bXAsIGEgYmlnIHBhcnQgb2YgaGlzIHNwZWVjaCBpcyByZWxhdGVkIHRvIGxlZ2lzbGF0aW9uLCBlcXVhbGl0eSwgZGVmZW5zZSBhbmQgQW1lcmljYS4KIyMjICgxKSBGb3IgQmFyYWNrT2JhbWEsIGl0IGlzIGVxdWFsaXR5LCBmcmVlZG9tLCBnb3Zlcm5tZW50IGFuZCBBbWVyaWNhLgoKCiMjIDIuNC4yIEhvdyBhcmUgdGhlIHNlbnRlbmNlcyByZWxhdGVkIHRvIHRvcGljcz8KCmBgYHtyLCBlY2hvPUZBTFNFfQpzcGVlY2guZGY9dGJsX2RmKGNvcnB1cy5saXN0LmRmKSU+JWZpbHRlcih0eXBlPT0iaW5hdWciLCB3b3JkLmNvdW50PDIwKSU+JXNlbGVjdChzZW50ZW5jZXMsIEVjb25vbXk6TGVnaXNsYXRpb24pCgphcy5jaGFyYWN0ZXIoc3BlZWNoLmRmJHNlbnRlbmNlc1thcHBseShhcy5kYXRhLmZyYW1lKHNwZWVjaC5kZlssLTFdKSwgMiwgd2hpY2gubWF4KV0pCgpuYW1lcyhzcGVlY2guZGYpWy0xXQpgYGAKCiMjIyBGcm9tIHRoZSByZXN1bHQgYWJvdmUsIHdlIGNhbiBjbGVhcmx5IHNlZSBob3cgdG9waWMgbW9kZWxpbmcgd29yay4KCgojIENvbmNsdXNpb24KCiMjIyBJbiBjb25jbHVzaW9uLCBmcm9tIHRoZXNlIGFuYWx5c2lzLCB3ZSBtYXkgZmluZCBhIGxvdCBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBpbmF1Z3VyYWwgc3BlZWNoIG9mIERlbW9jcmF0aWMgUGFydHkgYW5kIFJlcHVibGljYW4gUGFydHksIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBzZW50ZW5jZSBkaXN0cmlidXRpb24sIGVtb3Rpb24gY2x1c3RlciBhbmQgc28gb24uCgojIyMgU28gYXMgdG8gRG9uYWxkSlRydW1wIGZyb20gUmVwdWJsaWNhbiBQYXJ0eSBhbmQgQmFyYWNrT2JhbWEgZnJvbSBEZW1vY3JhdGljIFBhcnR5LCB0aGV5IGhhdmUgbG90cyBvZiBkaWZmZXJlbmNlcyBpbiB0aGVpciBzcGVlY2gncyBwYXR0ZXJuLCBsaWtlIHNlbnRpbWVudCBkaWZmZXJlbmNlLCB0b3BpYyBkaWZmZXJlbmNlIGFuZCBzbyBvbi4KCiMgUmVmZXJlbmNlCgojIyMgd2syLVR1dG9yaWFsLVRleHRNaW5pbmcgaHR0cHM6Ly9naXRodWIuY29tL1Rac3RhdHNBRFMvQURTX1RlYWNoaW5nL3RyZWUvbWFzdGVyL1R1dG9yaWFscy93azItVGV4dE1pbmluZwo=